--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/sideband/core.py bec6bda2f6c19c802fc7cffd3f18ccba9ecb8388 (bec6bda2) Text, 45.32 KB
Tff7b72import T7ee787RNS
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787threading
Tff7b72import T7ee787plyer
Tff7b72import T7ee787osT7ee787.T7ee787path
Tff7b72import T7ee787time
Tff7b72import T7ee787sqlite3
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787msgpack
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72from T7ee787jnius Tff7b72import Te6edf3autoclassTb4b4b4, Te6edf3cast
Tff7b72class T56d364PropagationNodeDetectorTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3EMITTED_DELTA_GRACE Tff7b72= T79c0ff300
Te6edf3EMITTED_DELTA_IGNORE Tff7b72= T79c0ff10
Te6edf3aspect_filter Tff7b72= Ta5d6ff"Ta5d6fflxmf.propagationTa5d6ff"
Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3announced_identityTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3unpacked Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3app_dataTb4b4b4)
Te6edf3node_active Tff7b72= Te6edf3unpackedTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3emitted Tff7b72= Te6edf3unpackedTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3age Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3emitted
Tff7b72if Te6edf3age Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffWarning, propagation node announce emitted in the future, possible timing inconsistency or tampering attempt.Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3age Tff7b72< Tff7b72-T79c0ff1Tff7b72*Te6edf3PropagationNodeDetectorTff7b72.Td2a8ffEMITTED_DELTA_GRACETb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffAnnounce timestamp too far in the future, discarding itTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3age Tff7b72> Tff7b72-T79c0ff1Tff7b72*Te6edf3PropagationNodeDetectorTff7b72.Td2a8ffEMITTED_DELTA_IGNORETb4b4b4:
T8b949e# age = 0
Tff7b72pass
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDetected active propagation node Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff emission Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff seconds ago, Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hopsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hops awayTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8fflog_announceTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3dest_typeTff7b72=Te6edf3PropagationNodeDetectorTff7b72.Td2a8ffaspect_filterTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflxmf_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffactive_propagation_node Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffset_active_propagation_nodeTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3prev_hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffactive_propagation_nodeTb4b4b4)
Tff7b72if Te6edf3hops Tff7b72<Tff7b72= Te6edf3prev_hopsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffset_active_propagation_nodeTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72pass
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while processing received propagation node announce: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffowner_app Tff7b72= Te6edf3ownerTff7b72.Td2a8ffowner_app
Tff7b72class T56d364SidebandCoreTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3CONV_P2P Tff7b72= T79c0ff0x01
Te6edf3CONV_GROUP Tff7b72= T79c0ff0x02
Te6edf3CONV_BROADCAST Tff7b72= T79c0ff0x03
Te6edf3MAX_ANNOUNCES Tff7b72= T79c0ff48
Te6edf3JOB_INTERVAL Tff7b72= T79c0ff1
Te6edf3aspect_filter Tff7b72= Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"
Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3announced_identityTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
T8b949e# Add the announce to the directory announce
T8b949e# stream logger
Tff7b72selfTff7b72.Td2a8fflog_announceTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3dest_typeTff7b72=Te6edf3SidebandCoreTff7b72.Td2a8ffaspect_filterTb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3owner_appTb4b4b4, Te6edf3is_serviceTff7b72=Tff7b72FalseTb4b4b4, Te6edf3is_clientTff7b72=Tff7b72FalseTb4b4b4, Te6edf3android_app_dirTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffis_service Tff7b72= Te6edf3is_service
Tff7b72selfTff7b72.Td2a8ffis_client Tff7b72= Te6edf3is_client
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffis_service Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffis_clientTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffis_standalone Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffis_standalone Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffowner_app Tff7b72= Te6edf3owner_app
Tff7b72selfTff7b72.Td2a8ffreticulum Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffapp_dir Tff7b72= Te6edf3plyerTff7b72.Td2a8ffstoragepathTff7b72.Td2a8ffget_home_dirTb4b4b4(Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/.config/sidebandTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffrns_configdir Tff7b72= Tff7b72None
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapp_dir Tff7b72= Te6edf3android_app_dirTff7b72+Ta5d6ff"Ta5d6ff/io.unsigned.sideband/files/Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffrns_configdir Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_dirTff7b72+Ta5d6ff"Ta5d6ff/app_storage/reticulumTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffasset_dir Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_dirTff7b72+Ta5d6ff"Ta5d6ff/app/assetsTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffasset_dir Tff7b72= Te6edf3plyerTff7b72.Td2a8ffstoragepathTff7b72.Td2a8ffget_application_dirTb4b4b4(Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/sbapp/assetsTa5d6ff"
Tff7b72selfTff7b72.Td2a8fficon Tff7b72= Tff7b72selfTff7b72.Td2a8ffasset_dirTff7b72+Ta5d6ff"Ta5d6ff/icon.pngTa5d6ff"
Tff7b72selfTff7b72.Td2a8fficon_48 Tff7b72= Tff7b72selfTff7b72.Td2a8ffasset_dirTff7b72+Ta5d6ff"Ta5d6ff/icon_48.pngTa5d6ff"
Tff7b72selfTff7b72.Td2a8fficon_32 Tff7b72= Tff7b72selfTff7b72.Td2a8ffasset_dirTff7b72+Ta5d6ff"Ta5d6ff/icon_32.pngTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffnotification_icon Tff7b72= Tff7b72selfTff7b72.Td2a8ffasset_dirTff7b72+Ta5d6ff"Ta5d6ff/notification_icon.pngTa5d6ff"
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffapp_dirTff7b72+Ta5d6ff"Ta5d6ff/app_storageTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffapp_dirTff7b72+Ta5d6ff"Ta5d6ff/app_storageTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfig_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_dirTff7b72+Ta5d6ff"Ta5d6ff/app_storage/sideband_configTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffidentity_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_dirTff7b72+Ta5d6ff"Ta5d6ff/app_storage/primary_identityTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffdb_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_dirTff7b72+Ta5d6ff"Ta5d6ff/app_storage/sideband.dbTa5d6ff"
Tff7b72selfTff7b72.Td2a8fflxmf_storage Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_dirTff7b72+Ta5d6ff"Ta5d6ff/app_storage/Ta5d6ff"
Tff7b72selfTff7b72.Td2a8fffirst_run Tff7b72= Tff7b72True
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfig_pathTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__init_configTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__load_configTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fffirst_run Tff7b72= Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while configuring Sideband: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
T8b949e# Initialise Reticulum configuration
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrns_configdir Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_dirTff7b72+Ta5d6ff"Ta5d6ff/app_storage/reticulumTa5d6ff"
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrns_configdirTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrns_configdirTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffConfiguring Reticulum instance...Ta5d6ff"Tb4b4b4)
Te6edf3config_file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrns_configdirTff7b72+Ta5d6ff"Ta5d6ff/configTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3config_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3rns_configTb4b4b4)
Te6edf3config_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while configuring Reticulum instance: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ffactive_propagation_node Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpropagation_detector Tff7b72= Te6edf3PropagationNodeDetectorTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_detectorTb4b4b4)
Tff7b72def Td2a8ff__init_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreating new Sideband configuration...Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_pathTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_pathTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffto_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_pathTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Tb4b4b4{Tb4b4b4}
T8b949e# Settings
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffAnonymous PeerTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffstart_announceTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_by_defaultTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffhome_node_as_broadcast_repeaterTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffsend_telemetry_to_home_nodeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflxmf_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflxmf_sync_limitTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflxmf_sync_maxTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff3
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnn_home_nodeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
T8b949e# Connectivity
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_localTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_local_groupidTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_local_ifac_netnameTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_local_ifac_passphraseTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcpTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_hostTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffsideband.connect.reticulum.networkTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_portTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff7822Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_ifac_netnameTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_ifac_passphraseTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2pTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2p_b32Ta5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffmrwqlsioq4hoo2lmeeud7dkfscnm7yxak7dmiyvsrnpfag3z5tsq.b32.i2pTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2p_ifac_netnameTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2p_ifac_passphraseTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ff__save_configTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__db_initTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffshould_persist_dataTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffreticulum Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreticulumTff7b72.Td2a8ff_should_persist_dataTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsave_configurationTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__load_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoading Sideband identity...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentity_pathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoading Sideband configuration... Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfig_pathTb4b4b4)Tb4b4b4)
Te6edf3config_file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfig_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3config_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3config_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__db_initTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_initstateTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_db_initpersistentTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__save_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaving Sideband configuration...Ta5d6ff"Tb4b4b4)
Te6edf3config_file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfig_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3config_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4)Tb4b4b4)
Te6edf3config_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffsave_configurationTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaving configurationTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__save_configTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffset_active_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3dest Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo active propagation node configuredTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffactive_propagation_node Tff7b72= Te6edf3dest
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3dest
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffset_outbound_propagation_nodeTb4b4b4(Te6edf3destTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffActive propagation node set to: Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__save_configTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while setting LXMF propagation node: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffnotifyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3titleTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3groupTff7b72=Tff7b72NoneTb4b4b4, Te6edf3context_idTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3notifications_enabled Tff7b72= Tff7b72True
Tff7b72if Te6edf3notifications_enabledTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffgetpersistentTb4b4b4(Ta5d6ff"Ta5d6ffpermissions.notificationsTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3notifications_permitted Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3notifications_permitted Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3notifications_permitted Tff7b72= Tff7b72True
Tff7b72if Te6edf3notifications_permittedTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_serviceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffowner_serviceTff7b72.Td2a8ffandroid_notificationTb4b4b4(Te6edf3titleTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3groupTff7b72=Te6edf3groupTb4b4b4, Te6edf3context_idTff7b72=Te6edf3context_idTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3plyerTff7b72.Td2a8ffnotificationTff7b72.Td2a8ffnotifyTb4b4b4(Te6edf3titleTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3notification_iconTff7b72=Tff7b72selfTff7b72.Td2a8ffnotification_iconTb4b4b4, Te6edf3context_overrideTff7b72=Tff7b72NoneTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3plyerTff7b72.Td2a8ffnotificationTff7b72.Td2a8ffnotifyTb4b4b4(Te6edf3titleTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3app_iconTff7b72=Tff7b72selfTff7b72.Td2a8fficon_32Tb4b4b4)
Tff7b72def Td2a8fflog_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destTb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3dest_typeTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3dest_typeTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff announce for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with data: Ta5d6ff"Tff7b72+Te6edf3app_dataTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_db_save_announceTb4b4b4(Te6edf3destTb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3dest_typeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.flags.new_announcesTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffException while decoding LXMF destination announce data:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fflist_conversationsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Tff7b72selfTff7b72.Td2a8ff_db_conversationsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3result Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3result
Tff7b72elseTb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8fflist_announcesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Tff7b72selfTff7b72.Td2a8ff_db_announcesTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3result Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3result
Tff7b72elseTb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8ffhas_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Te6edf3existing_conv Tff7b72= Tff7b72selfTff7b72.Td2a8ff_db_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72if Te6edf3existing_conv Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffis_trustedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3existing_conv Tff7b72= Tff7b72selfTff7b72.Td2a8ff_db_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72if Te6edf3existing_conv Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6fftrustTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while checking trust for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffraw_display_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3existing_conv Tff7b72= Tff7b72selfTff7b72.Td2a8ff_db_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72if Te6edf3existing_conv Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72and Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff"
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while getting peer name: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Ta5d6ff"Ta5d6ff"
Tff7b72def Td2a8ffpeer_display_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3existing_conv Tff7b72= Tff7b72selfTff7b72.Td2a8ff_db_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72if Te6edf3existing_conv Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72and Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72if Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6fftrustTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72return Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3app_data Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecall_app_dataTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72if Te6edf3app_data Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3existing_convTb4b4b4[Ta5d6ff"Ta5d6fftrustTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72return Te6edf3app_dataTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3app_dataTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3app_data Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecall_app_dataTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72if Te6edf3app_data Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3app_dataTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode a valid peer name from data: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72def Td2a8ffclear_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_clear_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72def Td2a8ffdelete_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_clear_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_db_delete_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72def Td2a8ffdelete_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3message_hashTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_delete_messageTb4b4b4(Te6edf3message_hashTb4b4b4)
Tff7b72def Td2a8ffread_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_conversation_set_unreadTb4b4b4(Te6edf3context_destTb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72def Td2a8ffunread_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_conversation_set_unreadTb4b4b4(Te6edf3context_destTb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8fftrusted_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_conversation_set_trustedTb4b4b4(Te6edf3context_destTb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8ffuntrusted_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_conversation_set_trustedTb4b4b4(Te6edf3context_destTb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72def Td2a8ffnamed_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_conversation_set_nameTb4b4b4(Te6edf3context_destTb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72def Td2a8fflist_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4, Te6edf3after Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Tff7b72selfTff7b72.Td2a8ff_db_messagesTb4b4b4(Te6edf3context_destTb4b4b4, Te6edf3afterTb4b4b4)
Tff7b72if Te6edf3result Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3result
Tff7b72elseTb4b4b4:
Tff7b72return Tb4b4b4[Tb4b4b4]
Tff7b72def Td2a8ffservice_availableTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3service_heartbeat Tff7b72= Tff7b72selfTff7b72.Td2a8ffgetstateTb4b4b4(Ta5d6ff"Ta5d6ffservice.heartbeatTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3service_heartbeatTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3service_heartbeat Tff7b72> T79c0ff2.5Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72exceptTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffgui_foregroundTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_db_getstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.foregroundTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffgui_displayTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_db_getstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.displayingTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffgui_conversationTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_db_getstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.active_conversationTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffsetstateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3propTb4b4b4, Te6edf3valTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_setstateTb4b4b4(Te6edf3propTb4b4b4, Te6edf3valTb4b4b4)
Tff7b72def Td2a8ffgetstateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3propTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_db_getstateTb4b4b4(Te6edf3propTb4b4b4)
Tff7b72def Td2a8ffsetpersistentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3propTb4b4b4, Te6edf3valTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_setpersistentTb4b4b4(Te6edf3propTb4b4b4, Te6edf3valTb4b4b4)
Tff7b72def Td2a8ffgetpersistentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3propTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_db_getpersistentTb4b4b4(Te6edf3propTb4b4b4)
Tff7b72def Td2a8ff__event_conversations_changedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ff__event_conversation_changedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ff__db_initTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffDROP TABLE IF EXISTS lxmTa5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffCREATE TABLE lxm (lxm_hash BLOB PRIMARY KEY, dest BLOB, source BLOB, title BLOB, tx_ts INTEGER, rx_ts INTEGER, state INTEGER, method INTEGER, t_encrypted INTEGER, t_encryption INTEGER, data BLOB)Ta5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffDROP TABLE IF EXISTS convTa5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffCREATE TABLE conv (dest_context BLOB PRIMARY KEY, last_tx INTEGER, last_rx INTEGER, unread INTEGER, type INTEGER, trust INTEGER, name BLOB, data BLOB)Ta5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffDROP TABLE IF EXISTS announceTa5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffCREATE TABLE announce (id PRIMARY KEY, received INTEGER, source BLOB, data BLOB, dest_type BLOB)Ta5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffDROP TABLE IF EXISTS stateTa5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffCREATE TABLE state (property BLOB PRIMARY KEY, value BLOB)Ta5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffDROP TABLE IF EXISTS persistentTa5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffCREATE TABLE persistent (property BLOB PRIMARY KEY, value BLOB)Ta5d6ff"Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_initstateTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffDROP TABLE IF EXISTS stateTa5d6ff"Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffCREATE TABLE state (property BLOB PRIMARY KEY, value BLOB)Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_db_setstateTb4b4b4(Ta5d6ff"Ta5d6ffdatabase_readyTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8ff_db_getstateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3propTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffselect * from state where property=:upropTa5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffupropTa5d6ff"Tb4b4b4: Te6edf3propTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4}Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3entry Tff7b72= Te6edf3resultTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3val Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3val
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not unpack state value from database for property Tffea00\"Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3propTb4b4b4)Tff7b72+Ta5d6ff"Tffea00\"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_db_setstateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3propTb4b4b4, Te6edf3valTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3uprop Tff7b72= Te6edf3propTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3bval Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3valTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_db_getstateTb4b4b4(Te6edf3propTb4b4b4) Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffINSERT INTO state (property, value) values (?, ?)Ta5d6ff"
Te6edf3data Tff7b72= Tb4b4b4(Te6edf3upropTb4b4b4, Te6edf3bvalTb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3dataTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffUPDATE state set value=:bval where property=:uprop;Ta5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffbvalTa5d6ff"Tb4b4b4: Te6edf3bvalTb4b4b4, Ta5d6ff"Ta5d6ffupropTa5d6ff"Tb4b4b4: Te6edf3upropTb4b4b4}Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_initpersistentTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffCREATE TABLE IF NOT EXISTS persistent (property BLOB PRIMARY KEY, value BLOB)Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_db_getpersistentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3propTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffselect * from persistent where property=:upropTa5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffupropTa5d6ff"Tb4b4b4: Te6edf3propTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4}Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3entry Tff7b72= Te6edf3resultTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3val Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3val
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not unpack persistent value from database for property Tffea00\"Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3propTb4b4b4)Tff7b72+Ta5d6ff"Tffea00\"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_db_setpersistentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3propTb4b4b4, Te6edf3valTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3uprop Tff7b72= Te6edf3propTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3bval Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3valTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_db_getpersistentTb4b4b4(Te6edf3propTb4b4b4) Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffINSERT INTO persistent (property, value) values (?, ?)Ta5d6ff"
Te6edf3data Tff7b72= Tb4b4b4(Te6edf3upropTb4b4b4, Te6edf3bvalTb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3dataTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffUPDATE persistent set value=:bval where property=:uprop;Ta5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffbvalTa5d6ff"Tb4b4b4: Te6edf3bvalTb4b4b4, Ta5d6ff"Ta5d6ffupropTa5d6ff"Tb4b4b4: Te6edf3upropTb4b4b4}Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_conversation_set_unreadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4, Te6edf3unreadTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffUPDATE conv set unread = ? where dest_context = ?Ta5d6ff"
Te6edf3data Tff7b72= Tb4b4b4(Te6edf3unreadTb4b4b4, Te6edf3context_destTb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_conversation_set_trustedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4, Te6edf3trustedTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffUPDATE conv set trust = ? where dest_context = ?Ta5d6ff"
Te6edf3data Tff7b72= Tb4b4b4(Te6edf3trustedTb4b4b4, Te6edf3context_destTb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_conversation_set_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffUPDATE conv set name=:name_data where dest_context=:ctx;Ta5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffctxTa5d6ff"Tb4b4b4: Te6edf3context_destTb4b4b4, Ta5d6ff"Ta5d6ffname_dataTa5d6ff"Tb4b4b4: Te6edf3nameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4}Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_conversationsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffselect * from convTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3convs Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3entry Tff7b72in Te6edf3resultTb4b4b4:
Te6edf3conv Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffunreadTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Te6edf3convsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3convTb4b4b4)
Tff7b72return Te6edf3convs
Tff7b72def Td2a8ff_db_announcesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffselect * from announce order by received descTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3announces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3entry Tff7b72in Te6edf3resultTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3announce Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff3Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftimeTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff4Tb4b4b4]
Tb4b4b4}
Te6edf3announcesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3announceTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffException while fetching announce from DB: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Te6edf3announces
Tff7b72def Td2a8ff_db_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffselect * from conv where dest_context=:ctxTa5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffctxTa5d6ff"Tb4b4b4: Te6edf3context_destTb4b4b4}Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3c Tff7b72= Te6edf3resultTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3conv Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3convTb4b4b4[Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3convTb4b4b4[Ta5d6ff"Ta5d6fflast_txTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3convTb4b4b4[Ta5d6ff"Ta5d6fflast_rxTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3convTb4b4b4[Ta5d6ff"Ta5d6ffunreadTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[T79c0ff3Tb4b4b4]
Te6edf3convTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[T79c0ff4Tb4b4b4]
Te6edf3convTb4b4b4[Ta5d6ff"Ta5d6fftrustTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[T79c0ff5Tb4b4b4]
Te6edf3convTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4[T79c0ff6Tb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3convTb4b4b4[Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3cTb4b4b4[T79c0ff7Tb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3conv
Tff7b72def Td2a8ff_db_clear_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffClearing conversation with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffdelete from lxm where (dest=:ctx_dst or source=:ctx_dst);Ta5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffctx_dstTa5d6ff"Tb4b4b4: Te6edf3context_destTb4b4b4}Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_delete_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDeleting conversation with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffdelete from conv where (dest_context=:ctx_dst);Ta5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffctx_dstTa5d6ff"Tb4b4b4: Te6edf3context_destTb4b4b4}Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_create_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4, Te6edf3name Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3trust Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreating conversation for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3context_destTb4b4b4)Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3def_name Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffINSERT INTO conv (dest_context, last_tx, last_rx, unread, type, trust, name, data) values (?, ?, ?, ?, ?, ?, ?, ?)Ta5d6ff"
Te6edf3data Tff7b72= Tb4b4b4(Te6edf3context_destTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3SidebandCoreTff7b72.Td2a8ffCONV_P2PTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3def_nameTb4b4b4, Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tff7b72NoneTb4b4b4)Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3trustTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_conversation_set_trustedTb4b4b4(Te6edf3context_destTb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3name Tff7b72!= Tff7b72None Tff7b72and Te6edf3name Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_conversation_set_nameTb4b4b4(Te6edf3context_destTb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__event_conversations_changedTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_delete_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msg_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDeleting message Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3msg_hashTb4b4b4)Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffdelete from lxm where (lxm_hash=:mhash);Ta5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffmhashTa5d6ff"Tb4b4b4: Te6edf3msg_hashTb4b4b4}Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_clean_messagesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPurging stale messages... Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffdelete from lxm where (state=:outbound_state or state=:sending_state);Ta5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffoutbound_stateTa5d6ff"Tb4b4b4: Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffOUTBOUNDTb4b4b4, Ta5d6ff"Ta5d6ffsending_stateTa5d6ff"Tb4b4b4: Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSENDINGTb4b4b4}Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_message_set_stateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lxm_hashTb4b4b4, Te6edf3stateTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffUPDATE lxm set state = ? where lxm_hash = ?Ta5d6ff"
Te6edf3data Tff7b72= Tb4b4b4(Te6edf3stateTb4b4b4, Te6edf3lxm_hashTb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_db_message_set_methodTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lxm_hashTb4b4b4, Te6edf3methodTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffUPDATE lxm set method = ? where lxm_hash = ?Ta5d6ff"
Te6edf3data Tff7b72= Tb4b4b4(Te6edf3methodTb4b4b4, Te6edf3lxm_hashTb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffmessageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msg_hashTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_db_messageTb4b4b4(Te6edf3msg_hashTb4b4b4)
Tff7b72def Td2a8ff_db_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msg_hashTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffselect * from lxm where lxm_hash=:mhashTa5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffmhashTa5d6ff"Tb4b4b4: Te6edf3msg_hashTb4b4b4}Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3entry Tff7b72= Te6edf3resultTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3lxm Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffunpack_from_bytesTb4b4b4(Te6edf3entryTb4b4b4[T79c0ff10Tb4b4b4]Tb4b4b4)
Te6edf3message Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8ffhashTb4b4b4,
Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8ffdestination_hashTb4b4b4,
Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8ffsource_hashTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8fftitleTb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8ffcontentTb4b4b4,
Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffsentTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8fftimestampTb4b4b4,
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff7Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fflxmTa5d6ff"Tb4b4b4: Te6edf3lxm
Tb4b4b4}
Tff7b72return Te6edf3message
Tff7b72def Td2a8ff_db_messagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4, Te6edf3after Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3after Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffselect * from lxm where dest=:context_dest or source=:context_destTa5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffcontext_destTa5d6ff"Tb4b4b4: Te6edf3context_destTb4b4b4}Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffselect * from lxm where (dest=:context_dest or source=:context_dest) and rx_ts>:after_tsTa5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffcontext_destTa5d6ff"Tb4b4b4: Te6edf3context_destTb4b4b4, Ta5d6ff"Ta5d6ffafter_tsTa5d6ff"Tb4b4b4: Te6edf3afterTb4b4b4}Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3dbcTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3messages Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3entry Tff7b72in Te6edf3resultTb4b4b4:
Te6edf3lxm Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffunpack_from_bytesTb4b4b4(Te6edf3entryTb4b4b4[T79c0ff10Tb4b4b4]Tb4b4b4)
Te6edf3message Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8ffhashTb4b4b4,
Ta5d6ff"Ta5d6ffdestTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8ffdestination_hashTb4b4b4,
Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8ffsource_hashTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8fftitleTb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8ffcontentTb4b4b4,
Ta5d6ff"Ta5d6ffreceivedTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffsentTa5d6ff"Tb4b4b4: Te6edf3lxmTff7b72.Td2a8fftimestampTb4b4b4,
Ta5d6ff"Ta5d6ffstateTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmethodTa5d6ff"Tb4b4b4: Te6edf3entryTb4b4b4[T79c0ff7Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fflxmTa5d6ff"Tb4b4b4: Te6edf3lxm
Tb4b4b4}
Te6edf3messagesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72return Te6edf3messages
Tff7b72def Td2a8ff_db_save_lxmTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lxmTb4b4b4, Te6edf3context_destTb4b4b4)Tb4b4b4:
Te6edf3state Tff7b72= Te6edf3lxmTff7b72.Td2a8ffstate
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3lxmTff7b72.Td2a8ffpackedTb4b4b4:
Te6edf3lxmTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffINSERT INTO lxm (lxm_hash, dest, source, title, tx_ts, rx_ts, state, method, t_encrypted, t_encryption, data) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)Ta5d6ff"
Te6edf3data Tff7b72= Tb4b4b4(
Te6edf3lxmTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3lxmTff7b72.Td2a8ffdestination_hashTb4b4b4,
Te6edf3lxmTff7b72.Td2a8ffsource_hashTb4b4b4,
Te6edf3lxmTff7b72.Td2a8fftitleTb4b4b4,
Te6edf3lxmTff7b72.Td2a8fftimestampTb4b4b4,
Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3stateTb4b4b4,
Te6edf3lxmTff7b72.Td2a8ffmethodTb4b4b4,
Te6edf3lxmTff7b72.Td2a8fftransport_encryptedTb4b4b4,
Te6edf3lxmTff7b72.Td2a8fftransport_encryptionTb4b4b4,
Te6edf3lxmTff7b72.Td2a8ffpacked
Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__event_conversation_changedTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72def Td2a8ff_db_save_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Te6edf3dest_typeTff7b72=Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3db Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4)
Te6edf3dbc Tff7b72= Te6edf3dbTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffINSERT INTO announce (received, source, data, dest_type) values (?, ?, ?, ?)Ta5d6ff"
Te6edf3data Tff7b72= Tb4b4b4(
Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3destination_hashTb4b4b4,
Te6edf3app_dataTb4b4b4,
Te6edf3dest_typeTb4b4b4,
Tb4b4b4)
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3dataTb4b4b4)
Te6edf3query Tff7b72= Ta5d6ff"Ta5d6ffdelete from announce where id not in (select id from announce order by received desc limit Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffMAX_ANNOUNCESTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff)Ta5d6ff"
Te6edf3dbcTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fflxmf_announceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_standalone Tff7b72or Tff7b72selfTff7b72.Td2a8ffis_serviceTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.announceTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.announceTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8ffis_knownTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dest_hashTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3source_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3dest_hashTb4b4b4)
Tff7b72if Te6edf3source_identityTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffrequest_keyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dest_hashTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3dest_hashTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while querying for key: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72def Td2a8ff_service_jobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_serviceTb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3SidebandCoreTff7b72.Td2a8ffJOB_INTERVALTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffgetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.announceTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_announceTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__start_jobs_deferredTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffstart_announceTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_announceTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_serviceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffservice_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff_service_jobsTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffservice_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__start_jobs_immediateTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# TODO: Reset loglevel
Tff7b72selfTff7b72.Td2a8ffreticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Tff7b72selfTff7b72.Td2a8ffrns_configdirTb4b4b4, Te6edf3loglevelTff7b72=T79c0ff7Tb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffreticulumTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRunning as master or standalone instance, adding interfacesTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_local Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffinterface_tcp Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffinterface_i2p Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_localTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAdding Auto Interface...Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_local_groupidTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3group_id Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3group_id Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_local_groupidTa5d6ff"Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_local_ifac_netnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3ifac_netname Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3ifac_netname Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_local_ifac_netnameTa5d6ff"Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_local_ifac_passphraseTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3ifac_netkey Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3ifac_netkey Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_local_ifac_passphraseTa5d6ff"Tb4b4b4]
Te6edf3autointerface Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffAutoInterfaceTff7b72.Td2a8ffAutoInterfaceTb4b4b4(
Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4,
Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffAutoInterfaceTa5d6ff"Tb4b4b4,
Te6edf3group_id Tff7b72= Te6edf3group_id
Tb4b4b4)
Te6edf3autointerfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffreticulumTff7b72.Td2a8ff_add_interfaceTb4b4b4(Te6edf3autointerfaceTb4b4b4,Te6edf3ifac_netnameTff7b72=Te6edf3ifac_netnameTb4b4b4,Te6edf3ifac_netkeyTff7b72=Te6edf3ifac_netkeyTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_local Tff7b72= Te6edf3autointerface
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while adding AutoInterface. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_local Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcpTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAdding TCP Interface...Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_hostTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3tcp_host Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_hostTa5d6ff"Tb4b4b4]
Te6edf3tcp_port Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_portTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3tcp_port Tff7b72> T79c0ff0 Tff7b72and Te6edf3tcp_port Tff7b72<Tff7b72= T79c0ff65536Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_ifac_netnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3ifac_netname Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3ifac_netname Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_ifac_netnameTa5d6ff"Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_ifac_passphraseTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3ifac_netkey Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3ifac_netkey Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_tcp_ifac_passphraseTa5d6ff"Tb4b4b4]
Te6edf3tcpinterface Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffTCPInterfaceTff7b72.Td2a8ffTCPClientInterfaceTb4b4b4(
Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4,
Ta5d6ff"Ta5d6ffTCPClientInterfaceTa5d6ff"Tb4b4b4,
Te6edf3tcp_hostTb4b4b4,
Te6edf3tcp_portTb4b4b4,
Te6edf3kiss_framing Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3i2p_tunneled Tff7b72= Tff7b72False
Tb4b4b4)
Te6edf3tcpinterfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffreticulumTff7b72.Td2a8ff_add_interfaceTb4b4b4(Te6edf3tcpinterfaceTb4b4b4,Te6edf3ifac_netnameTff7b72=Te6edf3ifac_netnameTb4b4b4,Te6edf3ifac_netkeyTff7b72=Te6edf3ifac_netkeyTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_tcp Tff7b72= Te6edf3tcpinterface
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while adding TCP Interface. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_tcp Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2pTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2p_b32Ta5d6ff"Tb4b4b4]Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.b32.i2pTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2p_ifac_netnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3ifac_netname Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3ifac_netname Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2p_ifac_netnameTa5d6ff"Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2p_ifac_passphraseTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3ifac_netkey Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3ifac_netkey Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2p_ifac_passphraseTa5d6ff"Tb4b4b4]
Te6edf3i2pinterface Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffI2PInterfaceTff7b72.Td2a8ffI2PInterfaceTb4b4b4(
Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4,
Ta5d6ff"Ta5d6ffI2PInterfaceTa5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffstoragepathTb4b4b4,
Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffconnect_i2p_b32Ta5d6ff"Tb4b4b4]Tb4b4b4]Tb4b4b4,
Te6edf3connectable Tff7b72= Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3i2pinterfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffreticulumTff7b72.Td2a8ff_add_interfaceTb4b4b4(Te6edf3i2pinterfaceTb4b4b4,Te6edf3ifac_netnameTff7b72=Te6edf3ifac_netnameTb4b4b4,Te6edf3ifac_netkeyTff7b72=Te6edf3ifac_netkeyTb4b4b4)
Tff7b72for Te6edf3si Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3siTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffI2PInterfaceTff7b72.Td2a8ffI2PInterfacePeerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffinterface_i2p Tff7b72= Te6edf3si
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while adding I2P Interface. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_i2p Tff7b72= Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReticulum started, activating LXMF...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_router Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTb4b4b4(Te6edf3identity Tff7b72= Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3storagepath Tff7b72= Tff7b72selfTff7b72.Td2a8fflxmf_storageTb4b4b4, Te6edf3autopeer Tff7b72= Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffregister_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8fflxmf_deliveryTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflxmf_destination Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffregister_delivery_identityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3display_nameTff7b72=Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffset_default_app_dataTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_display_name_bytesTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrns_dir Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffconfigdir
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflxmf_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflxmf_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_active_propagation_nodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflxmf_propagation_nodeTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_propagation_nodeTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_active_propagation_nodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_propagation_nodeTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffset_active_propagation_nodeTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8ffmessage_notificationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3messageTff7b72.Td2a8ffstate Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffFAILED Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3messageTb4b4b4, Ta5d6ff"Ta5d6fftry_propagation_on_failTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3messageTff7b72.Td2a8fftry_propagation_on_failTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDirect delivery of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3messageTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff failed. Retrying as propagated message.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3messageTff7b72.Td2a8fftry_propagation_on_fail Tff7b72= Tff7b72None
Te6edf3messageTff7b72.Td2a8ffdelivery_attempts Tff7b72= T79c0ff0
Tff7b72del Te6edf3messageTff7b72.Td2a8ffnext_delivery_attempt
Te6edf3messageTff7b72.Td2a8ffpacked Tff7b72= Tff7b72None
Te6edf3messageTff7b72.Td2a8ffdesired_method Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffPROPAGATED
Tff7b72selfTff7b72.Td2a8ff_db_message_set_methodTb4b4b4(Te6edf3messageTff7b72.Td2a8ffhashTb4b4b4, Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffPROPAGATEDTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffhandle_outboundTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxm_ingestTb4b4b4(Te6edf3messageTb4b4b4, Te6edf3originatorTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8ffsend_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3propagationTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3content Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffMessage content cannot be emptyTa5d6ff"Tb4b4b4)
Te6edf3dest_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3dest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3dest_identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdeliveryTa5d6ff"Tb4b4b4)
Te6edf3source Tff7b72= Tff7b72selfTff7b72.Td2a8fflxmf_destination
T8b949e# TODO: Add setting
Tff7b72if Te6edf3propagationTb4b4b4:
Te6edf3desired_method Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffPROPAGATED
Tff7b72elseTb4b4b4:
Te6edf3desired_method Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffDIRECT
Te6edf3lxm Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTb4b4b4(Te6edf3destTb4b4b4, Te6edf3sourceTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3titleTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3desired_methodTff7b72=Te6edf3desired_methodTb4b4b4)
Te6edf3lxmTff7b72.Td2a8ffregister_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_notificationTb4b4b4)
Te6edf3lxmTff7b72.Td2a8ffregister_failed_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_notificationTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTb4b4b4(Tb4b4b4) Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3lxmTff7b72.Td2a8fftry_propagation_on_fail Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffhandle_outboundTb4b4b4(Te6edf3lxmTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflxm_ingestTb4b4b4(Te6edf3lxmTb4b4b4, Te6edf3originatorTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while sending message: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffnew_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dest_strTb4b4b4, Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3trusted Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dest_strTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72tryTb4b4b4:
Te6edf3addr_b Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3dest_strTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_db_create_conversationTb4b4b4(Te6edf3addr_bTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3trustedTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while creating conversation: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffcreate_conversationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3context_destTb4b4b4, Te6edf3name Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3trusted Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_create_conversationTb4b4b4(Te6edf3context_destTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3trustedTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while creating conversation: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72return Tff7b72True
Tff7b72def Td2a8fflxm_ingestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3originator Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3should_notify Tff7b72= Tff7b72False
Te6edf3is_trusted Tff7b72= Tff7b72False
Tff7b72if Te6edf3originatorTb4b4b4:
Te6edf3context_dest Tff7b72= Te6edf3messageTff7b72.Td2a8ffdestination_hash
Tff7b72elseTb4b4b4:
Te6edf3context_dest Tff7b72= Te6edf3messageTff7b72.Td2a8ffsource_hash
Te6edf3is_trusted Tff7b72= Tff7b72selfTff7b72.Td2a8ffis_trustedTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72if Te6edf3is_trustedTb4b4b4:
Te6edf3should_notify Tff7b72= Tff7b72True
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_db_messageTb4b4b4(Te6edf3messageTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMessage exists, setting state to: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3messageTff7b72.Td2a8ffstateTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_db_message_set_stateTb4b4b4(Te6edf3messageTff7b72.Td2a8ffhashTb4b4b4, Te6edf3messageTff7b72.Td2a8ffstateTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMessage does not exist, savingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_db_save_lxmTb4b4b4(Te6edf3messageTb4b4b4, Te6edf3context_destTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_db_conversationTb4b4b4(Te6edf3context_destTb4b4b4) Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_create_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.flags.new_conversationsTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffgui_displayTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffmessages_screenTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffgui_conversationTb4b4b4(Tb4b4b4) Tff7b72!= Te6edf3context_destTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffunread_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.flags.unread_conversationsTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffgui_foregroundTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3should_notify Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffunread_conversationTb4b4b4(Te6edf3context_destTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffapp.flags.unread_conversationsTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_clientTb4b4b4:
Te6edf3should_notify Tff7b72= Tff7b72False
Tff7b72if Te6edf3should_notifyTb4b4b4:
Te6edf3nlen Tff7b72= T79c0ff128
Te6edf3text Tff7b72= Te6edf3messageTff7b72.Td2a8ffcontentTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3notification_content Tff7b72= Te6edf3textTb4b4b4[Tb4b4b4:Te6edf3nlenTb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3textTb4b4b4) Tff7b72> Te6edf3nlenTb4b4b4:
Te6edf3text Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff...Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffnotifyTb4b4b4(Te6edf3titleTff7b72=Tff7b72selfTff7b72.Td2a8ffpeer_display_nameTb4b4b4(Te6edf3context_destTb4b4b4)Tb4b4b4, Te6edf3contentTff7b72=Te6edf3notification_contentTb4b4b4, Te6edf3groupTff7b72=Ta5d6ff"Ta5d6ffLXMTa5d6ff"Tb4b4b4, Te6edf3context_idTff7b72=Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3context_destTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_db_clean_messagesTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__start_jobs_immediateTb4b4b4(Tb4b4b4)
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__start_jobs_deferredTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffsetDaemonTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_db_setstateTb4b4b4(Ta5d6ff"Ta5d6ffcore.startedTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSideband Core Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff startedTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrequest_lxmf_syncTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3limit Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLE Tff7b72or Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_COMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffrequest_messages_from_propagation_nodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3max_messages Tff7b72= Te6edf3limitTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF message sync requested from propagation node Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffcancel_lxmf_syncTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72!= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffcancel_propagation_node_requestsTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffget_sync_progressTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_progress
Tff7b72def Td2a8fflxmf_deliveryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4:
Te6edf3time_string Tff7b72= Te6edf3timeTff7b72.Td2a8ffstrftimeTb4b4b4(Ta5d6ff"Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffSTa5d6ff"Tb4b4b4, Te6edf3timeTff7b72.Td2a8fflocaltimeTb4b4b4(Te6edf3messageTff7b72.Td2a8fftimestampTb4b4b4)Tb4b4b4)
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffSignature is invalid, reason undeterminedTa5d6ff"
Tff7b72if Te6edf3messageTff7b72.Td2a8ffsignature_validatedTb4b4b4:
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffValidatedTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSIGNATURE_INVALIDTb4b4b4:
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffInvalid signatureTa5d6ff"
Tff7b72if Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSOURCE_UNKNOWNTb4b4b4:
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffCannot verify, source is unknownTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF delivery Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3time_stringTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3signature_stringTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxm_ingestTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while ingesting LXMF message Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3messageTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to database: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffget_display_name_bytesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffget_sync_statusTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLETb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffIdleTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_PATH_REQUESTEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffPath requestedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHINGTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffEstablishing linkTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffLink establishedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_REQUEST_SENTTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffSync request sentTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RECEIVINGTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffReceiving messagesTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RESPONSE_RECEIVEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffMessages receivedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_COMPLETETb4b4b4:
Te6edf3new_msgs Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_last_result
Tff7b72if Te6edf3new_msgs Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffDone, no new messagesTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffDownloaded Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3new_msgsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff new messagesTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffUnknownTa5d6ff"
Te6edf3rns_config Tff7b72= Ta5d6ff"""
Ta5d6ff[reticulum]
Ta5d6ffenable_transport = False
Ta5d6ffshare_instance = Yes
Ta5d6ffshared_instance_port = 37428
Ta5d6ffinstance_control_port = 37429
Ta5d6ffpanic_on_interface_error = No
Ta5d6ff[logging]
Ta5d6ffloglevel = 3
Ta5d6ff"""Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────